package com.htwy.core.model;

import com.htwy.core.config.WebappConfig;
import com.htwy.kits.NumberKit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.*;
import com.jfinal.plugin.ehcache.CacheName;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>菜单<br />
 * 表名:ht_sys_menu<br />
 * 编写时间:2018-01-01<br />
 * 缓存名:com.htwy.core.model.Menu</p>
 * @author 贾治国
 * @version 1.0-SNAPSHOT
 */
@CacheName("com.htwy.core.model.Menu")
public class Menu extends CacheModel<Menu> implements IBean{

    public static Menu dao = new Menu();

    
    /**
     * <p>设置主键</p>
     * @param uuid 主键
     * @return 当前对象
     */
    public Menu setUuid(String uuid){
        set("uuid", uuid);
        return this;
    }

    /**
     * <p>获取主键</p>
     * @return 主键
     */
    public String getUuid(){
        return getStr("uuid");
    }
    
    /**
     * <p>设置菜单名称</p>
     * @param name 菜单名称
     * @return 当前对象
     */
    public Menu setName(String name){
        set("name", name);
        return this;
    }

    /**
     * <p>获取菜单名称</p>
     * @return 菜单名称
     */
    public String getName(){
        return getStr("name");
    }
    
    /**
     * <p>设置上级菜单</p>
     * @param parentId 上级菜单
     * @return 当前对象
     */
    public Menu setParentId(String parentId){
        set("parentId", parentId);
        return this;
    }

    /**
     * <p>获取上级菜单</p>
     * @return 上级菜单
     */
    public String getParentId(){
        return getStr("parentId");
    }
    
    /**
     * <p>设置类型</p>
     * @param type 类型
     * @return 当前对象
     */
    public Menu setType(String type){
        set("type", type);
        return this;
    }

    /**
     * <p>获取类型</p>
     * @return 类型
     */
    public String getType(){
        return getStr("type");
    }
    
    /**
     * <p>设置级别</p>
     * @param level 级别
     * @return 当前对象
     */
    public Menu setLevel(Integer level){
        set("level", level);
        return this;
    }

    /**
     * <p>获取级别</p>
     * @return 级别
     */
    public Integer getLevel(){
        return getInt("level");
    }
    
    /**
     * <p>设置访问地址</p>
     * @param enter 访问地址
     * @return 当前对象
     */
    public Menu setEnter(String enter){
        set("enter", enter);
        return this;
    }

    /**
     * <p>获取访问地址</p>
     * @return 访问地址
     */
    public String getEnter(){
        return getStr("enter");
    }

    /**
     * <p>设置样式</p>
     * @param icon 样式
     * @return 当前对象
     */
    public Menu setIcon(String icon){
        set("icon", icon);
        return this;
    }

    /**
     * <p>获取样式</p>
     * @return 样式
     */
    public String getIcon(){
        return getStr("icon");
    }

    /**
     * <p>设置对应权限</p>
     * @param permission 对应权限
     * @return 当前对象
     */
    public Menu setPermission(String permission){
        set("permission", permission);
        return this;
    }

    /**
     * <p>获取对应权限</p>
     * @return 对应权限
     */
    public String getPermission(){
        return getStr("permission");
    }
    
    /**
     * <p>设置状态</p>
     * @param status 状态
     * @return 当前对象
     */
    public Menu setStatus(Integer status){
        set("status", status);
        return this;
    }

    /**
     * <p>获取状态</p>
     * @return 状态
     */
    public Integer getStatus(){
        return getInt("status");
    }
    
    /**
     * <p>设置索引</p>
     * @param serial 索引
     * @return 当前对象
     */
    public Menu setSerial(Integer serial){
        set("serial", serial);
        return this;
    }

    /**
     * <p>获取索引</p>
     * @return 索引
     */
    public Integer getSerial(){
        return getInt("serial");
    }
    
    /**
     * <p>设置创建者</p>
     * @param creator 创建者
     * @return 当前对象
     */
    public Menu setCreator(String creator){
        set("creator", creator);
        return this;
    }

    /**
     * <p>获取创建者</p>
     * @return 创建者
     */
    public String getCreator(){
        return getStr("creator");
    }
    
    /**
     * <p>设置创建时间</p>
     * @param createTime 创建时间
     * @return 当前对象
     */
    public Menu setCreateTime(Date createTime){
        set("createTime", createTime);
        return this;
    }

    /**
     * <p>获取创建时间</p>
     * @return 创建时间
     */
    public Date getCreateTime(){
        return getDate("createTime");
    }
    
    /**
     * <p>设置最后修改者</p>
     * @param mender 最后修改者
     * @return 当前对象
     */
    public Menu setMender(String mender){
        set("mender", mender);
        return this;
    }

    /**
     * <p>获取最后修改者</p>
     * @return 最后修改者
     */
    public String getMender(){
        return getStr("mender");
    }
    
    /**
     * <p>设置最后修改时间</p>
     * @param modifyTime 最后修改时间
     * @return 当前对象
     */
    public Menu setModifyTime(Date modifyTime){
        set("modifyTime", modifyTime);
        return this;
    }

    /**
     * <p>获取最后修改时间</p>
     * @return 最后修改时间
     */
    public Date getModifyTime(){
        return getDate("modifyTime");
    }
    
    /**
     * <p>设置删除者</p>
     * @param deletedBy 删除者
     * @return 当前对象
     */
    public Menu setDeletedBy(String deletedBy){
        set("deletedBy", deletedBy);
        return this;
    }

    /**
     * <p>获取删除者</p>
     * @return 删除者
     */
    public String getDeletedBy(){
        return getStr("deletedBy");
    }
    
    /**
     * <p>设置删除标志</p>
     * @param deletedMarker 删除标志
     * @return 当前对象
     */
    public Menu setDeletedMarker(Integer deletedMarker){
        set("deletedMarker", deletedMarker);
        return this;
    }

    /**
     * <p>获取删除标志</p>
     * @return 删除标志
     */
    public Integer getDeletedMarker(){
        return getInt("deletedMarker");
    }
    
    /**
     * <p>设置删除时间</p>
     * @param deleteTime 删除时间
     * @return 当前对象
     */
    public Menu setDeleteTime(Date deleteTime){
        set("deleteTime", deleteTime);
        return this;
    }

    /**
     * <p>获取删除时间</p>
     * @return 删除时间
     */
    public Date getDeleteTime(){
        return getDate("deleteTime");
    }
    
    /**
     * <p>设置子类型数量</p>
     * @param childrenCount 子类型数量
     * @return 当前对象
     */
    public Menu setChildrenCount(Integer childrenCount){
        set("childrenCount", childrenCount);
        return this;
    }

    /**
     * <p>获取子类型数量</p>
     * @return 子类型数量
     */
    public Integer getChildrenCount(){
        return getInt("childrenCount");
    }
    

    /**
     * <p>根据条件获取菜单列表<br />
     * sqlParaKey:com.htwy.core.model.Menu.findByCondition</p>
     * @param conditions 传入的条件
     * @return 菜单列表
     */
    @Override
    public List<Menu> findByCondition(Map<String,Object> conditions){
        SqlPara sqlPara = getSqlPara("com.htwy.core.model.Menu.findByCondition",conditions);
        return dao().find(sqlPara);
    }

    /**
     * <p>根据分页信息和条件获取菜单列表<br />
     * sqlParaKey:com.htwy.core.model.Menu.findByCondition</p>
     * @param conditions 传入的条件
     * @return 菜单列表及分页信息
     */
    @Override
    public Page<Menu> paginateByCondition(Map<String, Object> conditions) {
        int pageNumber = 1;
        int pageSize = WebappConfig.getConfig().getInt("defaultPageSize", 20);
        if(conditions.containsKey("pageNumber")) {
            String pageNumberStr = (String) conditions.get("pageNumber");
            if (StrKit.notBlank(pageNumberStr) && NumberKit.isZNum(pageNumberStr)) {
                pageNumber = Integer.parseInt(pageNumberStr);
            }
        }
        if(conditions.containsKey("pageSize")) {
            String pageSizeStr = (String) conditions.get("pageSize");
            if (StrKit.notBlank(pageSizeStr) && NumberKit.isZNum(pageSizeStr)) {
                pageSize = Integer.parseInt(pageSizeStr);
            }
        }
        return paginateByCondition(pageNumber,pageSize,conditions);
    }

    /**
     * <p>根据分页信息和条件获取菜单列表<br />
     * sqlParaKey:com.htwy.core.model.Menu.findByCondition</p>
     * @param pageNumber 当前页数
     * @param pageSize 每页条数
     * @param conditions 传入的条件
     * @return 菜单列表及分页信息
     */
    @Override
    public Page<Menu> paginateByCondition(int pageNumber, int pageSize, Map<String, Object> conditions) {
        SqlPara sqlPara = getSqlPara("com.htwy.core.model.Menu.findByCondition",conditions);
        return dao().paginate(pageNumber,pageSize,sqlPara);
    }

    /**
     * <p>根据主键数组删除菜单<br />
     * sqlParaKey:com.htwy.core.model.Menu.deleteByPks</p>
     * @param pks 主键数组
     * @return 删除的条数
     */
    public int deleteByPks(String... pks){
        if(pks != null && pks.length>0) {
            SqlPara sqlPara = getSqlPara("com.htwy.core.model.Menu.deleteByPks", Kv.by("pks",pks));
            int result = Db.update(sqlPara);
            if(result > 0 ){
                clearCache();
            }
            return result;
        }
        return 0;
    }


    /**
     * <p>根据主键更新子节点数量<br />
     * sqlParaKey:com.htwy.core.model.Orgnazation.updateChildrenCount</p>
     * @param uuid 主键
     */
    public void updateChildrenCount(String uuid) {
        SqlPara sqlPara = getSqlPara("com.htwy.core.model.Menu.updateChildrenCount", Kv.by("uuid",uuid));
        int result = Db.update(sqlPara);
        if(result > 0 ){
            clearCache();
        }
    }

    /**
     * <p>根据主键更新子节点数量<br />
     * sqlParaKey:com.htwy.core.model.Orgnazation.getMaxSerialByParentId</p>
     * @param parentId 父节点id
     */
    public Integer getMaxSerialByParentId(String parentId) {
        SqlPara sqlPara = getSqlPara("com.htwy.core.model.Menu.getMaxSerialByParentId", Kv.by("parentId",parentId));
        return Db.queryInt(sqlPara.getSql(), sqlPara.getPara());
    }

    /**
     * 根据父ID获取子节点
     * @param parentId 父ID
     * @return
     */
    public List<Record> getByParentId(String parentId) {
        return Db.find(getSqlPara("com.htwy.core.model.Menu.findByCondition", Kv.by("parentId", parentId)));
    }

    /**
     * 根据菜单ID获取菜单list
     * @param menuId 菜单 ID
     * @return 所有的菜单项
     */
    public List<Record> getAllSubMenu(String menuId) {
        ArrayList<Record> result = new ArrayList<>();
        List<Record> list = getByParentId(menuId);
        if (list != null && list.size() > 0) {
            for (Record item : list) {
                if (item.getLong("childrenCount") > 0) {
                    List<Record> subList = getAllSubMenu(item.getStr("uuid"));
                    item.set("children", subList);
                }
                result.add(item);
            }
        }
        return list;
    }
}